#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <semaphore.h>

_PROTOTYPE ( int main, (void));
int main()
{
	sem_t p1,p2,cons,prod;
	int res;
        res=sem_init(&p1,1);
	if(res < 0){
		printf("error\n");
		return -1;
	}
        res=sem_init(&prod,1);
	if(res < 0){
		printf("error\n");
		return -1;
	}
	res=sem_init(&cons,0);
	if(res < 0){
		printf("error\n");
		return -1;
	}
        res=sem_init(&p2,0);
	if(res < 0){
		printf("error\n");
		return -1;
	}
        if(fork() == 0){
            if(fork() == 0){
                /* productor 1 */
                while(1){
                    res=sem_wait(&p1);
                    res+=sem_wait(&prod);
                    if(res < 0){
		        printf("error\n");
		        return -1;
	            }
	            printf("Productor1... \n");
                    fflush(stdout);
                    res=sem_post(&cons);
                    res+=sem_post(&p2);
                    if(res < 0){
		        printf("error\n");
		        return -1;
	            }
               }
             }else{
                 /* productor 2 */
                 while(1){           
		     res=sem_wait(&p2);
                     res+=sem_wait(&prod);
                     if(res < 0){
		        printf("error\n");
		        return -1;
	             }
	             printf("Productor2... \n");
                     fflush(stdout);
	             res=sem_post(&cons);
                     res+=sem_post(&p1);
                     if(res < 0){
		        printf("error\n");
		        return -1;
	            }
                 }
            }
        }else{ /* consumidor */
               while(1){
               res=sem_wait(&cons);
               if(res < 0){
		        printf("error\n");
		        return -1;
	       }
	       printf("Consumidor... \n");
               fflush(stdout);
	       res=sem_post(&prod);
               if(res < 0){
		        printf("error\n");
		        return -1;
	       }
               }
       }

	return 0;
}
